home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1997
/
MacHack 1997.toast
/
Hacks
/
Hacks ’95
/
INIT ThemeSong
/
AsyncInit.Asm
< prev
next >
Wrap
Assembly Source File
|
1995-06-24
|
4KB
|
252 lines
; .VERBOSE
INCLUDE HGMacs.Txt
INCLUDE Traps.D
INCLUDE SysEquX.D
INCLUDE ToolEqu.D
INCLUDE FSEqu.D
.TRAP _DebugStr $ABFF
.TRAP _SCSIDispatch $A815
scsiStat EQU 10
.MACRO _SCSIStat
MOVE.W #scsiStat,-(A7)
_SCSIDispatch
.ENDM
sndRefNum EQU -4
buffsize EQU 512*22
N EQU 8 ;number of buffers
vblSize EQU vblPhase+2
ffMode EQU 0
RECORD 0,INCREMENT
extlen$ VAR 4
MACRO extlen =| ;use (An) addressing
extptr VAR 4
rate VAR 4
datahndl VAR 4
codehndl VAR 4
taskcount VAR 2
ALGN 0,4 ;for '020 efficiency
hdrsize ENDR
RECORD 0,INCREMENT
FILL ioQElSize
vblQEl1 VAR vblSize
sndPB VAR ioQElSize
vblQEl2 VAR vblSize
FILL 4 ;for rate -- mode overlaps vblPhase
readbuff VAR buffsize
overrun VAR 368
ALGN 0,4 ;for '020 efficiency
blksize ENDR
ratevalue EQU $00010000
RESOURCE 'sysz' 0
DC.L (codeend-codestart)+1024+hdrsize+N*blkSize
RESOURCE 'INIT' 128 'AsyncInit' 1<<resSysHeap+1<<resLocked
codestart
JMP install
DC.W 'Copyright © 1990 Harvey Grosser'
readcomp:
countR EQU D1
MACRO extR =D2| ;EQU doesn't work properly in MOVEM or index reg.
MOVE.L A3,-(A7)
MOVE.L ioOwnBuf(A0),A3
MOVEM.L extlen(A3),extR/A1
MOVE.L ioActCount(A0),countR
CMP.L extR,countR
BGT.S @gtov
SUBQ.W #1,taskcount(A3)
BNE.S @more
MEA1 closed,ioCompletion(A0)
_Close ,ASYNC
BRA.S @restore
@more
LEA readbuff(A0),A0
MOVE.L countR,D0
_BlockMove
MOVE.L D0,extlen(A3) ;better than CLR.L on 68000
ADDA.L countR,A1
SUB.L countR,extR
MOVE.L #$80808080,D0
MOVEQ #3,countR
AND.W extR,countR
BRA.S @1
@0 MOVE.B D0,(A1)+
@1 DBRA countR,@0
LSR.W #3,extR
BCS.S @3
BRA.S @4
@2 MOVE.L D0,(A1)+
@3 MOVE.L D0,(A1)+
@4 DBRA extR,@2
BRA.S @restore
@gtov
;amount read is greater than previous overrun
LEA readbuff(A0),A0
MOVE.L extR,D0
_BlockMove
LEA -6(A0,extR),A1
LEA sndPB-readbuff(A0),A0
MOVE.L A1,ioBuffer(A0)
MOVE.W D0,(A1)+ ;D0 = 0 (ffMode) from BlockMove
MOVE.L rate(A3),(A1)+
SUB.L extR,countR ;amount left in buffer
ADDA.L countR,A1 ;point beyond data just read
MOVE.L #370<<16,extR ;largest possible dividend + 1
SUB.L countR,extR
DIVU #370,extR
CLR.W extR
SWAP extR
ADD.L extR,countR
MOVE.L countR,ioReqCount(A0)
_Write ,ASYNC
MOVEM.L extR/A1,extlen(A3)
@restore
MOVE.L (A7)+,A3
RTS
closed
MOVE.L ioOwnBuf(A0),A1
MOVE.L datahndl(A1),A0
_HUnlock
_HPurge
MOVE.L codehndl(A1),A0
_HUnlock
_HPurge
RTS
sndcomp:
BEQ.S @nokill ;test for _KillIO
CLR.L ioReqCount-sndPB(A0) ;terminate on _KillIO
@nokill MOVE.B #$80,SoundLevel ;eliminate end click on Mac SE
TST.B FSBusy
BNE.S @read
LEA vblQEl1-sndPB(A0),A0
ADDQ.W #1,vblCount(A0)
_VInstall
RTS
@read
LEA -sndPB(A0),A0
_Read ,ASYNC
RTS
vbltask1:
TST.B FSBusy
BNE.S @read
MOVE.L A0,A2
SUBQ #2,A7
_SCSIStat
TST.W (A7)+
BEQ.S @scsifree
ADDQ.W #1,vblCount(A2)
RTS
@scsifree
LEA vblQEl2-vblQEl1(A2),A0
LEA VBLQueue,A1
_Enqueue
RTS
@read
LEA -vblQEl1(A0),A0
_Read ,ASYNC
RTS
vbltask2:
_VRemove ;-> D0 = 0
BCLR #inVBL,VBLQueue+qFlags
CLR.L (A0) ;qLink
ADDQ.W #1,vblCount(A0)
LEA -vblQEl2(A0),A0
_Read ,ASYNC
RTS
compend
openerr:
MOVE.L datahndl(A3),A0
MOVE.L D0,D1
_DisposHandle
MOVE.L D1,D0
nomem:
NEG.W D0
MOVE.W D0,-(A7)
_SysBeep
RTS
install:
_HLock
MOVE.L A0,D6
MOVE.L #hdrsize+N*blkSize,D0
MOVE.L D0,D1
_ResrvMem ,SYS
MOVE.L D1,D0
_NewHandle ,SYS
BNE nomem
_HLock ;returns D0.L = 0
MOVEA.L (A0),A3
MOVE.L A3,A2
MOVEQ #(hdrsize+readbuff)/4-1,D1
@clr MOVE.L D0,(A2)+ ;faster than CLR.L
DBRA D1,@clr ;A2 points to readbuff
MOVE.W #N,taskcount(A3)
MOVE.L A0,datahndl(A3)
MOVE.L D6,codehndl(A3)
MOVE.L #ratevalue,rate(A3)
LEA hdrsize(A3),A0
MEA1 'StartupSound',ioFileName(A0)
MOVE.B #fsRdPerm,ioPermssn(A0)
_HOpen ;we'll eventually specify a DirID
BNE openerr
MEA1 readcomp,ioCompletion(A0)
MOVE.L A3,ioOwnBuf(A0)
MOVE.L A2,ioBuffer(A0) ;points to readbuff
MOVE.L #buffsize,ioReqCount(A0)
; ;CLR.W ioPosMode(A0) ;= fsAtMark
MOVE.W #sndRefNum,sndPB+ioRefNum(A0)
MEA1 sndcomp,sndPB+ioCompletion(A0)
ADDQ.W #vType,vblQEl1+qType(A0)
ADDQ.W #vType,vblQEl2+qType(A0)
MEA1 vbltask1,vblQEl1+vblAddr(A0)
MEA1 vbltask2,vblQEl2+vblAddr(A0)
ADDQ.W #1,vblQEl2+vblCount(A0)
_Read ,ASYNC
MOVEQ #N-2,D1
MOVE.L #blksize,D5
@top
MOVE.L #readbuff,D0
LEA 0(A0,D5.L),A1
_BlockMove
ADD.L D5,ioBuffer(A1)
MOVE.L A1,A0
_Read ,ASYNC
DBRA D1,@top
MOVE.L D6,-(A7)
_DetachResource
MOVE.L D6,A0
MOVE.L #compend-codestart,D0
_SetHandleSize
RTS
codeend
END